import 'lib/person.dart';

void main() {
  // 如果定义的属性或者类或者任意的字符串或数字,再属性名前加上_(下划线)name就是私有的属性不能被外部文件访问(例如import)
  var person = new Person('tom', 29, '杭州'); // 或直接Person()
  person.name = 'tom'; // 设置对象的值
  print(person.name); // 取对象的值
  print(Person.a); // 访问静态常量
  Person.getName(); // 访问静态方法
  person.work(); // 调用对象的方法
  print(person.address);
  const school = const School(100, '学校');
  const school1 = School(100, '学校'); // const可以省略
  print(school1.calss);

  // 对象操作符
  var a = new A(); // 创建对象
  a?.work(); // ?.可选链
  var b;
  b = '';
  b = new A();
  (b as A).work(); // as类型转换用法
  if (b is A) {
    // 判断对象is, is!
    print('b是对象A');
  }
  b
    ..a = '赋值'
    ..age = 10
    ..work(); // 级联操作
}

class A {
  String a = '';
  int age = 0;
  void work() {
    print(a);
  }
}

class Parents {
  String name;

  bool get check => this.name != null;

  Parents(this.name);
  Parents.withName(this.name);

  void getName() {
    print('parent name');
  }
}

class Child extends Parents {
  // 父类中有定义构造方法那么在继承的时候需要调用构造方法
  // 意思是子类的构造方法去显示的调用父类的构造方法
  // Child(String name) : super(name);
  Child(String name) : super.withName(name);

  @override // 来自父类
  bool get check => super.check == 'test'; // 修改父类的getter
  void work() {
    print('子类方法');
  }

  @override
  void getName() {
    super.getName();
  }
}

// 抽象类
// 不能被实例化
abstract class Student {
  void main() {}
}

// 接口(类就是接口)
// 对于普通类要重写全部属性对于抽象类可以不用
class Interface implements Parents {
  @override
  String name = '';
  @override
  bool get check => false;
  @override
  void getName() {}
}

// mixins
class B {
  void b() {}
}

class C {
  void c() {}
}

class D {
  void d() {}
}

class E extends B with C, D {
  // 多继承如果C和D有同样的方法那么根据位置会调用D的方法
}
